/*********************************************************************************************
    *   Filename        : app_main.c

    *   Description     :

    *   Copyright:(c)JIELI  2011-2019  @ , All Rights Reserved.
*********************************************************************************************/
#include "system/includes.h"
#include "app_config.h"
#include "app_action.h"
#include "app_main.h"
#include "update.h"
#include "update_loader_download.h"
#include "app_charge.h"
#include "app_power_manage.h"
#include "asm/charge.h"
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
#include "jl_kws/jl_kws_api.h"
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */

u8 BT_ON_FLAG=0;//蓝牙是否开启提供给充电判断使用的0不需要关，1需要关
u8 DC_5V_IN_Flag=0;//判断充电满后进入低功耗后不需要离开充电自动开机问题
u8 SYS_24G_SN_BYTE[4]={0,0,0,0};//控制遥控器配对的密码使用的预留4个字节

extern u8 get_power_on_status(void);
#define LOG_TAG_CONST       APP
#define LOG_TAG             "[APP]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"

/*任务列表 */
const struct task_info task_info_table[] = {
    {"app_core",            1,     0,   640,   128  },
    {"sys_event",           7,     0,   256,   0    },
    {"btctrler",            4,     0,   512,   256  },
    {"btencry",             1,     0,   512,   128  },
    {"btstack",             3,     0,   768,   256   },
    {"systimer",		    7,	   0,   128,   0	},
    {"update",				1,	   0,   512,   0    },
    {"dw_update",		 	2,	   0,   256,   128  },
#if (RCSP_BTMATE_EN)
    {"rcsp_task",		    2,	   0,   640,	0},
#endif
#if(USER_UART_UPDATE_ENABLE)
    {"uart_update",	        1,	   0,   256,   128	},
#endif
#if (XM_MMA_EN)
    {"xm_mma",   		    2,	   0,   640,   256	},
#endif
    {"usb_msd",           	1,     0,   512,   128  },
#if TCFG_AUDIO_ENABLE
    {"audio_dec",           3,     0,   768,   128  },
    {"audio_enc",           4,     0,   512,   128  },
#endif/*TCFG_AUDIO_ENABLE*/

#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
    {"kws",                 2,     0,   256,   64   },
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */

#if (TUYA_DEMO_EN)
    {"user_deal",           7,     0,   512,   512  },//定义线程 tuya任务调度
#endif

    {0, 0},
};

APP_VAR app_var;

void app_var_init(void)
{
    app_var.play_poweron_tone = 1;

    app_var.auto_off_time =  TCFG_AUTO_SHUT_DOWN_TIME;
    app_var.warning_tone_v = 340;
    app_var.poweroff_tone_v = 330;
}

__attribute__((weak))
u8 get_charge_online_flag(void)
{
    return 0;
}

void clr_wdt(void);
void check_power_on_key(void)
{
#if TCFG_POWER_ON_NEED_KEY

    u32 delay_10ms_cnt = 0;
    u8 LSdata;

    #if EMS_SYS_TYPE==0 //U8常规乐范波形款，3按键和4按键
       LSdata=2;//单价
    #else //U21主机款
       LSdata=70;//长按
    #endif

    while (1)
    {
        clr_wdt();
        os_time_dly(1);
        if (get_power_on_status()) {
            log_info("+");
            delay_10ms_cnt++;
            if (delay_10ms_cnt > LSdata) //改为短按开机 70改为
            {
                /* extern void set_key_poweron_flag(u8 flag); */
                /* set_key_poweron_flag(1); */
                SYS_to_LED_ON_Init();
                return;
            }
        } else {
            log_info("-");
            delay_10ms_cnt = 0;
            log_info("enter softpoweroff\n");
            power_set_soft_poweroff();
        }
    }
#endif
}


void LDO_5V_init()
{
     buzzer_pwm_out_init();//蜂鸣器初始化
     //led的灯脚初始化
     gpio_set_die(LED_PORT_IO, 1);//设置为数字引脚
     gpio_set_direction(LED_PORT_IO, 0);//设置为输出模式
     gpio_set_pull_down(LED_PORT_IO, 0);//下拉关
     gpio_set_pull_up(LED_PORT_IO, 0);//上拉关
     LED_OFF();

/*
    u32 delay_10ms_cnt = 0;
    while(1)
    {
         clr_wdt();
         os_time_dly(1);
         delay_10ms_cnt++;
         if(DC_5V_IN_Flag==1)
         {
            buzzer_pwm_out_init();//蜂鸣器初始化
            //led的灯脚初始化
            gpio_set_die(LED_PORT_IO, 1);//设置为数字引脚
            gpio_set_direction(LED_PORT_IO, 0);//设置为输出模式
            gpio_set_pull_down(LED_PORT_IO, 0);//下拉关
            gpio_set_pull_up(LED_PORT_IO, 0);//上拉关
            LED_ON();
            printf("DC_5V_IN_ON\n");
            return;
         }

         if(delay_10ms_cnt>200)
         {
            if(DC_5V_IN_Flag==1)
            {
                buzzer_pwm_out_init();//蜂鸣器初始化
                //led的灯脚初始化
                gpio_set_die(LED_PORT_IO, 1);//设置为数字引脚
                gpio_set_direction(LED_PORT_IO, 0);//设置为输出模式
                gpio_set_pull_down(LED_PORT_IO, 0);//下拉关
                gpio_set_pull_up(LED_PORT_IO, 0);//上拉关
                LED_ON();
                printf("DC_5V_IN_ON\n");
                return;
            }
            else
            {
              printf("DC_5V_IN_OFF\n");//判断是否内置充电唤醒
              LED_OFF();
              power_set_soft_poweroff();
            }
         }
    }  */

}

void app_main()
{
    struct intent it;
    u8 LSX1;

    if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
        int update = 0;
        update = update_result_deal();
    }

    printf(">>>>>>>>>>>>>>>>>app_main..U8PRO JPVH0.011demo 20240920ID-TEST\n");
   // V0.001demo(20220923):基本完成功能版本
   // V0.002demo(20220927):修复了离机后再按其他按键依然还是离机问题
   // V0.003demo(20221031):完全关闭了蓝牙接收功能，因为这个功能造成整体功耗偏高问题
   // V0.004demo(20221101):处理了模式0下长时间使用没办法回复初始化，同时模式3下输出脉冲越位造成15和16档频率不对
   // V0.005demo(20221102):通过USB_DM 口对地短路开启快速升压模式，测试专用的
   // V0.006demo(20221210):修改了6个模式，模式0位智能模式是模式3，模式4，模式5 每隔1分钟切换一次
   // V0.008demo(20230916):修改了V3版本提出的要求修改的
   // V0.008demo(20240111):修改ID的设置调试版本
   // V0.008demo(20240128)ID:日本定制版本的ID独立的从10-20总共20套主机
   // V0.009demo(20240302ID):日本客户定制款的程序同时可以通过USB口修改ID号
   // V0.010demo(20240516ID):修改了充电时关闭蓝牙功能节省20ma的充电电流
   // V0.011demo(20240529ID):修复了额外增加10个ma功耗问题
   // V0.011demo(20240529ID-TEST):上一个版本影响通信距离
   // HV0.011demo(20240917ID-TEST):加入升压后的版本调高了最后一个腿部模式的电压到70V
   // HV0.011demo(20240918ID-TEST):重新调整了各个数据的间隔让输出电压顺序更平缓
   // HV0.011demo(20240920ID-TEST):重新调整了各个数据的间隔让输出电压顺序更平缓


   //VU8 3KEY JPV0.006demo.230729按照日本的客户定制款波形
   //VU8 3KEY JPV0.008demo.230825按照日本的客户定制款波形重新修改了波形模式使用的
   //VU8 3KEY JPV0.0081demo.20240120增加了测试快速升压功能
   //U8PRO JPV0.009demo 20240302ID



    DC_5V_IN_Flag=0;

    LSX1=is_ldo5v_wakeup();//判断是不是由于充电开机的
    printf("is_ldo5v_wakeup:%d\n",LSX1);//判断是否内置充电唤醒

//20220806测试使用的
    if (get_charge_online_flag())
    {
#if(TCFG_SYS_LVD_EN == 1)
        vbat_check_init();
#endif
       LDO_5V_init();//充电初始化
    }
    else
    {
        check_power_on_voltage();
        check_power_on_key();
    }

/*
    //是否需要显示电量使用的
    if (get_charge_online_flag())
    {
#if(TCFG_SYS_LVD_EN == 1)
        vbat_check_init();
#endif
    }
    else
    {
        check_power_on_voltage();
    }

//判断是不是按键按下触发的开机
extern u8  SYS_Flag;
#if TCFG_POWER_ON_NEED_KEY
    SYS_Flag=0;
    if(LSX1==0)//非充电开机下有效
    {
        check_power_on_key();
    }
    else//充电中需要初始化蜂鸣器
    {
       LDO_5V_init();
    }
#endif
*/

#if TCFG_AUDIO_ENABLE
    extern int audio_dec_init();
    extern int audio_enc_init();
    audio_dec_init();
    audio_enc_init();
#endif/*TCFG_AUDIO_ENABLE*/

#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
    jl_kws_main_user_demo();
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */

    init_intent(&it);

#if CONFIG_APP_SPP_LE
    it.name = "spp_le";
    it.action = ACTION_SPPLE_MAIN;

#elif CONFIG_APP_AT_COM || CONFIG_APP_AT_CHAR_COM
    it.name = "at_com";
    it.action = ACTION_AT_COM;

#elif CONFIG_APP_DONGLE
    it.name = "dongle";
    it.action = ACTION_DONGLE_MAIN;

#elif CONFIG_APP_MULTI
    it.name = "multi_conn";
    it.action = ACTION_MULTI_MAIN;

#elif CONFIG_APP_NONCONN_24G
    it.name = "nonconn_24g";
    it.action = ACTION_NOCONN_24G_MAIN;

#elif CONFIG_APP_LL_SYNC
    it.name = "ll_sync";
    it.action = ACTION_LL_SYNC;

#elif CONFIG_APP_TUYA
    it.name = "tuya";
    it.action = ACTION_TUYA;

#elif CONFIG_APP_CENTRAL
    it.name = "central";
    it.action = ACTION_CENTRAL_MAIN;

#elif CONFIG_APP_DONGLE
    it.name = "dongle";
    it.action = ACTION_DONGLE_MAIN;

#elif CONFIG_APP_BEACON
    it.name = "beacon";
    it.action = ACTION_BEACON_MAIN;

#elif CONFIG_APP_IDLE
    it.name = "idle";
    it.action = ACTION_IDLE_MAIN;

#elif CONFIG_APP_CONN_24G
    it.name = "conn_24g";
    it.action = ACTION_CONN_24G_MAIN;

#else
    while (1) {
        printf("no app!!!");
    }
#endif


    log_info("run app>>> %s", it.name);
    log_info("%s,%s", __DATE__, __TIME__);//获得日期和时间

    start_app(&it);

#if TCFG_CHARGE_ENABLE
    set_charge_event_flag(1);
#endif
}

/*
 * app模式切换
 */
void app_switch(const char *name, int action)
{
    struct intent it;
    struct application *app;

    log_info("app_exit\n");

    init_intent(&it);
    app = get_current_app();
    if (app) {
        /*
         * 退出当前app, 会执行state_machine()函数中APP_STA_STOP 和 APP_STA_DESTORY
         */
        it.name = app->name;
        it.action = ACTION_BACK;
        start_app(&it);
    }

    /*
     * 切换到app (name)并执行action分支
     */
    it.name = name;
    it.action = action;
    start_app(&it);
}

int eSystemConfirmStopStatus(void)
{
    /* 系统进入在未来时间里，无任务超时唤醒，可根据用户选择系统停止，或者系统定时唤醒(100ms) */
    //1:Endless Sleep
    //0:100 ms wakeup
    /* log_info("100ms wakeup"); */
    return 1;
}

__attribute__((used)) int *__errno()
{
    static int err;
    return &err;
}


